ZGlmZiAtLWdpdCBhL3J0Yy9zM2MyNHgwX3J0Yy5jIGIvcnRjL3MzYzI0eDBfcnRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4MDA4ZAotLS0gL2Rldi9udWxsCisrKyBiL3J0Yy9zM2MyNHgwX3J0Yy5jCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAzCisgKiBEYXZpZCBN/GxsZXIgRUxTT0ZUIEFHIFN3aXR6ZXJsYW5kLiBkLm11ZWxsZXJAZWxzb2Z0LmNoCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIERhdGUgJiBUaW1lIHN1cHBvcnQgZm9yIHRoZSBidWlsdC1pbiBTYW1zdW5nIFMzQzI0WDAgUlRDCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1JUQ19TM0MyNFgwKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorCisjaWYgZGVmaW5lZChDT05GSUdfUzNDMjQwMCkKKyNpbmNsdWRlIDxzM2MyNDAwLmg+CisjZWxpZiBkZWZpbmVkKENPTkZJR19TM0MyNDEwKQorI2luY2x1ZGUgPHMzYzI0MTAuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8cnRjLmg+CisKKy8qI2RlZmluZQlERUJVRyovCisKK3R5cGVkZWYgZW51bSB7CisJUlRDX0VOQUJMRSwKKwlSVENfRElTQUJMRQorfSBSVENfQUNDRVNTOworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBTZXRSVENfQWNjZXNzKFJUQ19BQ0NFU1MgYSkKK3sKKwlTM0MyNFgwX1JUQyAqIGNvbnN0IHJ0YyA9IFMzQzI0WDBfR2V0QmFzZV9SVEMoKTsKKwlzd2l0Y2ggKGEpIHsKKwkJY2FzZSBSVENfRU5BQkxFOgorCQkJcnRjLT5SVENDT04gfD0gMHgwMTsgYnJlYWs7CisKKwkJY2FzZSBSVENfRElTQUJMRToKKwkJCXJ0Yy0+UlRDQ09OICY9IH4weDAxOyBicmVhazsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBiY2QyYmluICh1Y2hhciBuKQoreworCXJldHVybiAoKCgobiA+PiA0KSAmIDB4MEYpICogMTApICsgKG4gJiAweDBGKSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJpbjJiY2QgKHVuc2lnbmVkIGludCBuKQoreworCXJldHVybiAoKChuIC8gMTApIDw8IDQpIHwgKG4gJSAxMCkpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgcnRjX2dldCAoc3RydWN0IHJ0Y190aW1lICp0bXApCit7CisJUzNDMjRYMF9SVEMgKiBjb25zdCBydGMgPSBTM0MyNFgwX0dldEJhc2VfUlRDKCk7CisJdWNoYXIgc2VjLCBtaW4sIGhvdXIsIG1kYXksIHdkYXksIG1vbiwgeWVhcjsKKwl1Y2hhciBhX3NlYyxhX21pbiwgYV9ob3VyLCBhX2RhdGUsIGFfbW9uLCBhX3llYXIsIGFfYXJtZWQ7CisKKwkvKiBlbmFibGUgYWNjZXNzIHRvIFJUQyByZWdpc3RlcnMgKi8KKwlTZXRSVENfQWNjZXNzKFJUQ19FTkFCTEUpOworCisJLyogcmVhZCBSVEMgcmVnaXN0ZXJzICovCisJc2VjCT0gcnRjLT5CQ0RTRUM7CisJbWluCT0gcnRjLT5CQ0RNSU47CisJaG91cgk9IHJ0Yy0+QkNESE9VUjsKKwltZGF5CT0gcnRjLT5CQ0REQVRFOworCXdkYXkJPSBydGMtPkJDRERBWTsKKwltb24JPSBydGMtPkJDRE1PTjsKKwl5ZWFyCT0gcnRjLT5CQ0RZRUFSOworCisJLyogcmVhZCBBTEFSTSByZWdpc3RlcnMgKi8KKwlhX3NlYwk9IHJ0Yy0+QUxNU0VDOworCWFfbWluCT0gcnRjLT5BTE1NSU47CisJYV9ob3VyCT0gcnRjLT5BTE1IT1VSOworCWFfZGF0ZQk9IHJ0Yy0+QUxNREFURTsKKwlhX21vbgk9IHJ0Yy0+QUxNTU9OOworCWFfeWVhcgk9IHJ0Yy0+QUxNWUVBUjsKKwlhX2FybWVkCT0gcnRjLT5SVENBTE07CisKKwkvKiBkaXNhYmxlIGFjY2VzcyB0byBSVEMgcmVnaXN0ZXJzICovCisJU2V0UlRDX0FjY2VzcyhSVENfRElTQUJMRSk7CisKKyNpZmRlZiBSVENfREVCVUcKKwlwcmludGYgKCAiR2V0IFJUQyB5ZWFyOiAlMDJ4IG1vbi9jZW50OiAlMDJ4IG1kYXk6ICUwMnggd2RheTogJTAyeCAiCisJCSJocjogJTAyeCBtaW46ICUwMnggc2VjOiAlMDJ4XG4iLAorCQl5ZWFyLCBtb24sIG1kYXksIHdkYXksCisJCWhvdXIsIG1pbiwgc2VjKTsKKwlwcmludGYgKCAiQWxhcm1zOiAlMDJ4OiB5ZWFyOiAlMDJ4IG1vbnRoOiAlMDJ4IGRhdGU6ICUwMnggaG91cjogJTAyeCBtaW46ICUwMnggc2VjOiAlMDJ4XG4iLAorCQlhX2FybWVkLAorCQlhX3llYXIsIGFfbW9uLCBhX2RhdGUsCisJCWFfaG91ciwgYV9taW4sIGFfc2VjKTsKKyNlbmRpZgorCisJdG1wLT50bV9zZWMgID0gYmNkMmJpbihzZWMgICYgMHg3Rik7CisJdG1wLT50bV9taW4gID0gYmNkMmJpbihtaW4gICYgMHg3Rik7CisJdG1wLT50bV9ob3VyID0gYmNkMmJpbihob3VyICYgMHgzRik7CisJdG1wLT50bV9tZGF5ID0gYmNkMmJpbihtZGF5ICYgMHgzRik7CisJdG1wLT50bV9tb24gID0gYmNkMmJpbihtb24gJiAweDFGKTsKKwl0bXAtPnRtX3llYXIgPSBiY2QyYmluKHllYXIpOworCXRtcC0+dG1fd2RheSA9IGJjZDJiaW4od2RheSAmIDB4MDcpOworCWlmKHRtcC0+dG1feWVhcjw3MCkKKwkJdG1wLT50bV95ZWFyKz0yMDAwOworCWVsc2UKKwkJdG1wLT50bV95ZWFyKz0xOTAwOworCXRtcC0+dG1feWRheSA9IDA7CisJdG1wLT50bV9pc2RzdD0gMDsKKyNpZmRlZiBSVENfREVCVUcKKwlwcmludGYgKCAiR2V0IERBVEU6ICU0ZC0lMDJkLSUwMmQgKHdkYXk9JWQpICBUSU1FOiAlMmQ6JTAyZDolMDJkXG4iLAorCQl0bXAtPnRtX3llYXIsIHRtcC0+dG1fbW9uLCB0bXAtPnRtX21kYXksIHRtcC0+dG1fd2RheSwKKwkJdG1wLT50bV9ob3VyLCB0bXAtPnRtX21pbiwgdG1wLT50bV9zZWMpOworI2VuZGlmCit9CisKK3ZvaWQgcnRjX3NldCAoc3RydWN0IHJ0Y190aW1lICp0bXApCit7CisJUzNDMjRYMF9SVEMgKiBjb25zdCBydGMgPSBTM0MyNFgwX0dldEJhc2VfUlRDKCk7CisJdWNoYXIgc2VjLCBtaW4sIGhvdXIsIG1kYXksIHdkYXksIG1vbiwgeWVhcjsKKworI2lmZGVmIFJUQ19ERUJVRworCXByaW50ZiAoICJTZXQgREFURTogJTRkLSUwMmQtJTAyZCAod2RheT0lZCkgIFRJTUU6ICUyZDolMDJkOiUwMmRcbiIsCisJCXRtcC0+dG1feWVhciwgdG1wLT50bV9tb24sIHRtcC0+dG1fbWRheSwgdG1wLT50bV93ZGF5LAorCQl0bXAtPnRtX2hvdXIsIHRtcC0+dG1fbWluLCB0bXAtPnRtX3NlYyk7CisjZW5kaWYKKwl5ZWFyCT0gYmluMmJjZCh0bXAtPnRtX3llYXIgJSAxMDApOworCW1vbgk9IGJpbjJiY2QodG1wLT50bV9tb24pOworCXdkYXkJPSBiaW4yYmNkKHRtcC0+dG1fd2RheSk7CisJbWRheQk9IGJpbjJiY2QodG1wLT50bV9tZGF5KTsKKwlob3VyCT0gYmluMmJjZCh0bXAtPnRtX2hvdXIpOworCW1pbgk9IGJpbjJiY2QodG1wLT50bV9taW4pOworCXNlYwk9IGJpbjJiY2QodG1wLT50bV9zZWMpOworCisJLyogZW5hYmxlIGFjY2VzcyB0byBSVEMgcmVnaXN0ZXJzICovCisJU2V0UlRDX0FjY2VzcyhSVENfRU5BQkxFKTsKKworCS8qIHdyaXRlIFJUQyByZWdpc3RlcnMgKi8KKwlydGMtPkJDRFNFQwk9IHNlYzsKKwlydGMtPkJDRE1JTgk9IG1pbjsKKwlydGMtPkJDREhPVVIJPSBob3VyOworCXJ0Yy0+QkNEREFURQk9IG1kYXk7CisJcnRjLT5CQ0REQVkJPSB3ZGF5OworCXJ0Yy0+QkNETU9OCT0gbW9uOworCXJ0Yy0+QkNEWUVBUgk9IHllYXI7CisKKwkvKiBkaXNhYmxlIGFjY2VzcyB0byBSVEMgcmVnaXN0ZXJzICovCisJU2V0UlRDX0FjY2VzcyhSVENfRElTQUJMRSk7Cit9CisKK3ZvaWQgcnRjX3Jlc2V0ICh2b2lkKQoreworCVMzQzI0WDBfUlRDICogY29uc3QgcnRjID0gUzNDMjRYMF9HZXRCYXNlX1JUQygpOworCisJcnRjLT5SVENDT04gPSAocnRjLT5SVENDT04gJiB+MHgwNikgfCAweDA4OworCXJ0Yy0+UlRDQ09OICY9IH4weDA4OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNlbmRpZgkvKiBDT05GSUdfUlRDX1MzQzI0WDAgJiYgQ0ZHX0NNRF9EQVRFICovCg==